#include"StudentManager.h"

//定义一个查找的功能，以便删除，查找使用
int FindByName(Student* pc, char name[])
{
	int i = 0;
	for (i = 0; i < pc->size; i++)
	{
		if ((strcmp(pc->data[i].name, name)) == 0)
		{
			return i;
		}
	}
	return -1;
}
//初始化数据，以便使用
void InitStudent(Student* pc)
{
	pc->size = 0;
	memset(pc->data, 0, sizeof(pc->data));//初始化所有数据为0
}
//增加人员信息
void AddStudent(Student* pc)
{
	if (pc->size == 100)
	{
		printf("名单已满，无法添加\n");
		return;
	}
	//增加信息
	printf("请输入名字：\n");
	scanf_s("%s", pc->data[pc->size].name, 15);
	printf("请输入学号：\n");
	scanf_s("%s", pc->data[pc->size].ID, 15);
	printf("请输入籍贯：\n");
	scanf_s("%s", pc->data[pc->size].address, 20);
	printf("请输入年龄：\n");
	scanf_s("%d", &(pc->data[pc->size].age));
	printf("请输入数学、英语、物理成绩：\n");
	scanf_s("%d %d %d", &(pc->data[pc->size].score[0]), &(pc->data[pc->size].score[1]), &(pc->data[pc->size].score[2]));
	pc->size++;
	printf("信息添加成功\n");
}
//删除人员信息
void DelStudent(Student* pc)
{
	char name[15] = { 0 };
	if (pc->size == 0)
	{
		printf("名单已空，没有信息可以删除\n");
		return;
	}
	//1.查找要删除的人
	printf("请输入要删除的人：\n");
	scanf_s("%s", name, 15);

	int position = FindByName(pc, name);
	/*
	有/没有 --> 2. 删除
	*/
	if (position == -1)
	{
		printf("要删除的人不存在");
		return;
	}
	//删除
	int i = 0;
	for (i = position; i < pc->size - 1; i++)//size-1是因为左后一个元素没必要被覆盖，后面代码删除
	{
		pc->data[i] = pc->data[i + 1];//依次覆盖实现向前移动和删除

	}
	pc->size--;
	printf("删除成功\n");
}
//查找指定的人员 --> 借用了删除人员的代码以及打印信息的代码
void SearchStudent(Student* pc)
{
	char name[15] = { 0 };
	printf("请输入要查找的人：\n");
	scanf_s("%s", name, 15);
	int position = FindByName(pc, name);
	if (position == -1)
	{
		printf("要查找的人不存在");
		return;
	}//跟删除的判断一样的代码
	else//去打印找代码,注意更改一些内容
	{
		printf("%-10s\t%-10s\t%-10s\t%-10s\t%-20s\n", "姓名", "学号", "籍贯", "年龄", "成绩:数学、英语、物理、");
		printf("%-10s\t%-10s\t%-10s\t%-10d\t%d\t%d\t%d\n",
			pc->data[position].name,
			pc->data[position].ID,
			pc->data[position].address,
			pc->data[position].age,
			pc->data[position].score[0], pc->data[position].score[1], pc->data[position].score[2]);//从打印那里摘来的代码
	}
}
//修改指定的人员信息  --> 借用了查找的代码以及添加的代码
void ModifyStudent(Student* pc)//使用查找的代码进行改造
{
	char name[15] = { 0 };
	printf("请输入要修改的人：\n");
	scanf_s("%s", name, 15);
	int position = FindByName(pc, name);
	if (position == -1)
	{
		printf("要修改的人不存在");
		return;
	}//跟删除的判断一样的代码
	else//注意，这里是跟添加一样的代码
	{
		printf("请输入名字：\n");
		scanf_s("%s", pc->data[position].name, 15);
		printf("请输入学号：\n");
		scanf_s("%s", pc->data[position].ID, 15);
		printf("请输入籍贯：\n");
		scanf_s("%s", pc->data[position].address, 20);
		printf("请输入年龄：\n");
		scanf_s("%d", &(pc->data[position].age));
		printf("请输入数学、英语、物理成绩：\n");
		scanf_s("%d %d %d", &(pc->data[position].score[0]), &(pc->data[position].score[1]), &(pc->data[position].score[2]));
		printf("信息修改成功\n");
	}
}
//对人员进行排序
void SortStudent(Student* pc)
{
	for (int i = 0; i < pc->size; i++)
	{
		pc->data[i].sum = pc->data[i].score[0] + pc->data[i].score[1] + pc->data[i].score[2];
	}
	printf("总分排序结果：\n");//使用插入排序实现此功能
	StuInfo p;
	int i, j;
	for (i = 1; i < pc->size; i++)
		if (pc->data[i].sum > pc->data[i - 1].sum)
		{
			p = pc->data[i];
			for (j = i - 1; j >= 0 && pc->data[j].sum < p.sum; j--)
				pc->data[j + 1] = pc->data[j];
			pc->data[j + 1] = p;
		}
	StuInfo* t;
	i = 0;
	for (t = pc->data; t < pc->data + pc->size; t++)
	{
		pc->data[i].order = i + 1;
		i++;
	}
	//把排序之后的名单打印出来
	printf("%-10s\t%-10s\t%-10s\t%-10s\t%-20s\n", "姓名", "学号", "籍贯", "年龄", "成绩:数学、英语、物理、");
	for (int i = 0; i < pc->size; i++)
	{
		printf("%-10s\t%-10s\t%-10s\t%-10d\t%d\t%d\t%d\n",
			pc->data[i].name,
			pc->data[i].ID,
			pc->data[i].address,
			pc->data[i].age,
			pc->data[i].score[0], pc->data[i].score[1], pc->data[i].score[2]);//输入的三科成绩
	}
}
//存储文件
void SaveFile(Student* pc)
{
	FILE* fp = NULL;
	fopen_s(&fp, "studentInfo.txt", "wt+");  //b表示以二进制方式打开文件
	if (fp == NULL) //打开文件失败，返回错误信息
	{
		printf("open file for write error\n");
	}
	int i = 0;
	for (i = 0; i < pc->size; i++) {
		fprintf(fp, "%-10s\t%-10s\t%-10s\t%-10d\t 三科成绩：%d\t%d\t%d\n",
			pc->data[i].name,
			pc->data[i].ID,
			pc->data[i].address,
			pc->data[i].age,
			pc->data[i].score[0], pc->data[i].score[1], pc->data[i].score[2]);
	}
	fclose(fp);
	fp = NULL;
}
//打印信息
void PrintStulist(const Student* pc)
{
	int i = 0;
	//打印标题
	printf("%-10s\t%-10s\t%-10s\t%-10s\t%-20s\n", "姓名", "学号", "籍贯", "年龄", "成绩:数学、英语、物理、");
	for (i = 0; i < pc->size; i++)
	{
		printf("%-10s\t%-10s\t%-10s\t%-10d\t%d\t%d\t%d\n",
			pc->data[i].name,
			pc->data[i].ID,
			pc->data[i].address,
			pc->data[i].age,
			pc->data[i].score[0], pc->data[i].score[1], pc->data[i].score[2]);//输入的三科成绩
	}

}
//显示菜单界面
void menu()
{
	printf("---------------\n");
	printf("1.增     2.删 \n");
	printf("3.查     4.改 \n");
	printf("5.排     6.打印 \n");
	printf("    0.退出    \n");
	printf("---------------\n");
}
//枚举选项，以便switch语句使用

